/***************************************
 * 正则 相关
 ***************************************/
$.extend($app, {

	/**
	 * @function 创建模拟枚举
	 */
	createEnum(...args){

		return args.reduce((acc, next) => {
			const { _code, _label } = next

			return Object.assign(acc, {
				[_code]: next,
				[_label]: next
			})
			
		}, {})
	},


	/**
	 * @function 字符去首尾空格
	 * 
	 */
	trim(str){
		return str.replace(/(^\s*)|(\s*$)/g, "")
	},


	/**
	 * @function 函数组合 左 -> 右
	 * @param {functions} 函数组
	 * @returns { function } 返回包装函数
	 * @example
	 *  $app.pipe(
		* 	 a => a + 1,
		*   b => b - 10,
		*   console.log
		* )(15) // => 6 
		*/
	   pipe: (...fns) => (args) => fns.reduce((acc, next) => next(acc), args),
   
   
	   /**
		* @function 柯里化
		* @param { function } fn 被柯里化函数
		* @param { Array } args 参数数组
		* 
		* @example
		* 		
		* 	function add = (a, b) => a + b
		*  const addOne = curry(1)
		*  addOne(10) // => 11 
		*  
		*/
	   curry(fn, ..._args){
		   
		   return (...args) => {
			   args = [..._args,...args]
			   return args.length === fn.length ? fn(...args) : $app.curry(fn,  ...args)
		   }	
	   },
   
	
	/**
	 * @function 创建状态管理仓库
	 * @param { string } modelName 仓库名称 
	 */
	creatStore(modelName){

		class State{
			
			constructor(modelName){
				this.state = {}
				this.modelName = modelName
			}

			add(key, watch){
				if(!this.has(key)){
					this.state[key] = []
				}
				this.state[key].push(watch)
			}
			
			run(key, data){

				if(!this.has(key)){
					console.error(`${this.modelName} : ${key} 未注册`)
					return
				}
				
				this.state[key].forEach(fn => fn(data))
				
			}

			has(key){
				return this.state[key] !== undefined 
			}
			
		}

		return new State(modelName)
	},
	
	
	
	//获取随机数
	getRandomNum:function(Min, Max) {
        var Range = Max - Min;
        var Rand = Math.random();
        return (Min + Math.round(Rand * Range));
    },
	//字符串 转 数组
	strToArray: function(str) {
		var text = $app.delSpace(str); //去除空格
		var out = '';
		if ($app.judgeData(text)) {
			var out = text.split(',');
		} else {
			out = false;
		}

		return out;
	},

	//强制性转成JSON对象
	anyToJSON:function(obj){
		if(typeof obj==='object'){
			return obj;
		}else if(typeof obj==='string'){
			return JSON.parse(obj);
		}
	},

	//数组 转 字符串
	arrayToStr: function(arr) {
		var out = '';
		if ($app.judgeData(arr)) {
			var out = arr.join(',');
		} else {
			out = false;
		}

		return out;
	},
	//对象转数组 num：1键/2值
	objToArray: function (num, data) {
		var out = '';
		if (!!data) {
			//判断浏览器是否支持es6语法
			if (!!Object.keys && !!Object.values) {
				if (num == 1) { //取键
					out = Object.keys(data);
				} else if (num == 2) { //取值
					out = Object.values(data);
				}
			} else {
				var dataList = [];
				for (var i in data) {
					if (num == 1) { //取键
						dataList.push(i);
					} else if (num == 2) { //取值
						dataList.push(data[i]);
					}
				}
				out = dataList;
			}
		} else {
			out = []
		}
		return out;
	},

	/**
	 * 数组 最小值 计算
	 **/
	arrayMin: function(team) {
		return Math.min.apply(Math, team);
	},

	/**
	 * 数组 最大值 计算
	 **/
	arrayMax: function(team) {
		return Math.max.apply(Math, team);
	},
	/**
	 * 正整数 正则验证
	 **/
	numPlus: function(num) {
		var judge = false;
		if (parseInt(num) != 0) {
			judge = /^\d+$/.test(num);
		}
		return judge;
	},
	/**
	 * 身份证 正则验证
	 **/
	idCardCheck: function(num) {
		return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(num);
	},
	/**
	 * 邮箱 正则验证
	 **/
	mailCheck: function(num) {
		return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(num);
	},
	/**
	 * 固话 正则验证 010-22223333
	 **/
	homeTelCheck: function(num) {
		return /^\d{3}-\d{8}|\d{3}-\d{7}|\d{4}-\d{7}|\d{4}-\d{8}/.test(num);
	},
	//图片格式检测
	imgCheck: function(img) {
		var judge = /(\.jpeg|\.png|\.image|\.gif|\.bmp|\.jpg)$/i;
		return judge.test(img);
	},
	/**
	 * 手机 正则验证
	 **/
	telCheck: function(num) {
		return /^1[1234567890]\d{9}$/.test(parseInt(num));
	},
	/**
	 * 银行卡 正则验证
	 **/
	bankcardCheck: function(num) {
		return /^([1-9]{1})(\d{15}|\d{18})$/.test(parseInt(num));
	},
	/**
	 * 车牌号 正则验证
	 **/
	carNumCheck: function(num) {
		return /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}/.test(num);
	},
	/**
	 * qq号 正则验证
	 **/
	qqCheck: function(num) {
		return /^[1-9][0-9]{4,9}$/gim.test(num);
	},
	/**
	 * mac地址 正则验证
	 **/
	macCheck: function(num) {
		var aa=/[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}:[A-F\d]{2}/.test(num);
		return aa;
	}
});
